{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# avoid non-compliant Type 3 fonts\n",
    "import matplotlib\n",
    "matplotlib.rcParams['pdf.fonttype'] = 42"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import torch\n",
    "import torch.backends.cudnn as cudnn\n",
    "import torchvision.transforms as transforms\n",
    "from munch import Munch\n",
    "from tqdm import tqdm_notebook as tqdm\n",
    "\n",
    "import datasets\n",
    "import models\n",
    "from pose_estimation import models as pose_models\n",
    "from pose_estimation import utils as pose_utils\n",
    "from segmentation import models as segm_models"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_root = 'data/OilChangeDataset'\n",
    "ann_file = '20171103_OilChange.json'\n",
    "camera_name = 'floating_kinect1'\n",
    "cache_dir = 'cache/eval/'\n",
    "segm_config_path = 'segmentation/pretrained/drn_d_22_OilChange/config.yml'\n",
    "pose_config_path = 'pose_estimation/pretrained/floating_kinect1_mask/config.yml'\n",
    "#pose_config_path = 'pose_estimation/pretrained/floating_kinect1_mask_with_occlusion/config.yml'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "with open(segm_config_path, 'r') as f:\n",
    "    segm_cfg = Munch.fromYAML(f)\n",
    "    segm_cfg.training.resume = os.path.join('segmentation', segm_cfg.training.resume)\n",
    "with open(pose_config_path, 'r') as f:\n",
    "    pose_cfg = Munch.fromYAML(f)\n",
    "    pose_cfg.training.resume = os.path.join('pose_estimation', pose_cfg.training.resume)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "cudnn.benchmark = True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "=> loaded checkpoint 'segmentation/pretrained/drn_d_22_OilChange/checkpoint_00000900.pth.tar' (epoch 900)\n"
     ]
    }
   ],
   "source": [
    "segm_model = segm_models.DRNSeg(segm_cfg.arch, segm_cfg.data.classes, None, pretrained=True)\n",
    "segm_model = torch.nn.DataParallel(segm_model).cuda()\n",
    "segm_checkpoint = torch.load(segm_cfg.training.resume)\n",
    "segm_model.load_state_dict(segm_checkpoint['state_dict'])\n",
    "print(\"=> loaded checkpoint '{}' (epoch {})\".format(segm_cfg.training.resume, segm_checkpoint['epoch']))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "=> loaded checkpoint 'pose_estimation/pretrained/floating_kinect1_mask/checkpoint_00002100.pth.tar' (epoch 2100)\n"
     ]
    }
   ],
   "source": [
    "pose_model = pose_models.Model(pose_cfg.arch)\n",
    "pose_model = torch.nn.DataParallel(pose_model).cuda()\n",
    "pose_checkpoint = torch.load(pose_cfg.training.resume)\n",
    "pose_model.load_state_dict(pose_checkpoint['state_dict'])\n",
    "print(\"=> loaded checkpoint '{}' (epoch {})\".format(pose_cfg.training.resume, pose_checkpoint['epoch']))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loading annotations into memory...\n",
      "Done (t=0.06s)\n",
      "creating index...\n",
      "index created!\n",
      "using camera: floating_kinect1\n"
     ]
    }
   ],
   "source": [
    "transform = transforms.ToTensor()\n",
    "val_dataset = datasets.EvalDataset(data_root, 'val_' + ann_file, camera_name, pose_cfg.data.objects, transform)\n",
    "val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=1, shuffle=True, num_workers=0, pin_memory=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = models.EndToEndEvalModel(segm_model, pose_model).cuda()\n",
    "model.eval();"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def forward_batch(model, input, target, object_index, object_id):\n",
    "    target = target.cuda(non_blocking=True)\n",
    "    object_index = object_index.cuda(non_blocking=True)\n",
    "    object_id = object_id.cuda(non_blocking=True)\n",
    "\n",
    "    position, orientation = model(input, object_index, object_id)\n",
    "    position_error = (target[:, :3] - position).pow(2).sum(dim=1).sqrt()\n",
    "    orientation_error = 180.0 / np.pi * pose_utils.batch_rotation_angle(target[:, 3:], orientation)\n",
    "    \n",
    "    return position_error.cpu().numpy(), orientation_error.cpu().numpy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "cba37fbf7d104d7aaabc81865ed06001",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(IntProgress(value=0, max=683), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "position_errors = []\n",
    "orientation_errors = []\n",
    "with torch.no_grad():\n",
    "    for input, target, object_index, object_id in tqdm(val_loader):\n",
    "        position_error, orientation_error = forward_batch(model, input, target, object_index, object_id)\n",
    "        position_errors.extend(position_error)\n",
    "        orientation_errors.extend(orientation_error)\n",
    "position_errors = 100.0 * np.array(position_errors)\n",
    "orientation_errors = np.array(orientation_errors)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "mean position error: 3.76\n",
      "mean orientation error: 19.64\n",
      "median position error: 3.23\n",
      "median orientation error: 6.17\n",
      "success: 71.01\n"
     ]
    }
   ],
   "source": [
    "print('mean position error: {:.2f}'.format(position_errors.mean()))\n",
    "print('mean orientation error: {:.2f}'.format(orientation_errors.mean()))\n",
    "print('median position error: {:.2f}'.format(np.median(position_errors)))\n",
    "print('median orientation error: {:.2f}'.format(np.median(orientation_errors)))\n",
    "success = (position_errors < 5) * (orientation_errors < 15)\n",
    "print('success: {:.2f}'.format(100.0 * sum(success) / len(position_errors)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "if not os.path.exists(cache_dir):\n",
    "    os.makedirs(cache_dir)\n",
    "cache_path = os.path.join(cache_dir, '{}.npy'.format(pose_cfg.training.experiment_name))\n",
    "np.save(cache_path, (position_errors, orientation_errors))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x216 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(6, 3))\n",
    "ax = fig.add_subplot(111)\n",
    "ax.spines['top'].set_visible(False)\n",
    "ax.spines['right'].set_visible(False)\n",
    "ax.tick_params(axis='both', which='major', labelsize=12)\n",
    "ax.tick_params(axis='both', which='minor', labelsize=12)\n",
    "plt.hist(position_errors, bins=np.arange(40 + 1), density=True, rwidth=0.8, color='gray')\n",
    "plt.axvline(x=5, ls='--', lw=2, c='r')\n",
    "plt.xlabel('position error (cm)', fontsize=14)\n",
    "plt.ylabel('fraction of instances', fontsize=14)\n",
    "plt.xlim(0, 40)\n",
    "plt.savefig('figures/errors_position.pdf', bbox_inches='tight')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x216 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(6, 3))\n",
    "ax = fig.add_subplot(111)\n",
    "ax.spines['top'].set_visible(False)\n",
    "ax.spines['right'].set_visible(False)\n",
    "ax.tick_params(axis='both', which='major', labelsize=12)\n",
    "ax.tick_params(axis='both', which='minor', labelsize=12)\n",
    "plt.hist(orientation_errors, bins=np.arange(0, 180 + 1, 5), density=True, rwidth=0.8, color='gray')\n",
    "plt.axvline(x=15, ls='--', lw=2, c='r')\n",
    "plt.xlabel('orientation error (degrees)', fontsize=14)\n",
    "plt.ylabel('fraction of instances', fontsize=14)\n",
    "plt.xlim(0, 180)\n",
    "plt.ylim(0, 0.08)\n",
    "plt.savefig('figures/errors_orientation.pdf', bbox_inches='tight')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# comparison of orientation errors for models trained with and without occlusion\n",
    "cache_path_wo_occlusion = os.path.join(cache_dir, '{}.npy'.format('floating_kinect1_mask'))\n",
    "cache_path_with_occlusion = os.path.join(cache_dir, '{}.npy'.format('floating_kinect1_mask_with_occlusion'))\n",
    "position_errors_wo_occlusion, orientation_errors_wo_occlusion = np.load(cache_path_wo_occlusion)\n",
    "position_errors_with_occlusion, orientation_errors_with_occlusion = np.load(cache_path_with_occlusion)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZAAAADaCAYAAACICxRyAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3Xl8VNX5x/HPo6CRTRCRqvwqaMWFJWHRommQuqJ1pdqfggtYVrFa21ppf1qptSqFVsWiiK1grVjrTq3V1koUULQBEyguIApKtQooSwBZyvP7496kwzCT3CQzmSXf9+t1XzNz7p17nzlJ5sm5955zzN0RERGpqz0yHYCIiOQmJRAREakXJRAREakXJRAREakXJRAREakXJRAREakXJRAREakXJRAREakXJRAREamXZpkOIJUGDhzozz33XKbDqJlZ8KgRAEQke1h93pRXLZA1a9ZkOgQRkSYjrxKIiIg0HiUQERGpl7y6BpITdO1DRPKEEohII9m+fTurVq3iiy++yHQo0kQVFBTQqVMnmjdvnpL9KYGINJJVq1bRunVrOnfujFm9bnoRqTd3Z+3ataxatYouXbqkZJ9KIAk888wzCcvPPPPMhu+8T5/gccGChu9LcsoXX3yh5CEZY2a0b9+e1atXp2yfSiCNbeHCTEcgGaTkIZmU6t8/3YUlIiL1ohaISIYkO1VaXzWdYl23bh0zZ87kiiuuqPN+zzjjDGbOnEnbtm0bEh4ArVq1orKyst4xALt8jtLSUiZNmpSSuiwtLWWvvfbi+OOPb/C+EpkxYwZlZWX8+te/rvN7U/kzSCW1QESagHXr1nH33XcnXLdjx44a3/vss89m/IurKoaaPkdDlZaW8sorr6Rl3w2VDT+DRCIlEDPrYGYdYl73MLObzeyi9IUmIqkybtw4li9fTlFREddeey2lpaWUlJRw9tlnc/TRRwNw7rnn0qdPH7p168a0adOq39u5c2fWrFnDihUrOOqooxgxYgTdunXj1FNPZcuWLQAsX76cgQMH0qdPH0pKSnj77bcBeP/99znuuOPo0aMH119/fcLYJk6cyOTJkwG45pprOPHEEwF48cUXGTJkyC4xxH8OgMrKSs4//3yOPPJIhgwZgod9rf7+97/Tq1cvevToweWXX87WrVt32RdAWVkZAwYMYMWKFUydOpXbb7+doqIi5syZs0uMn332Geeeey49e/akX79+LFq0qPrYw4YNo0ePHvTs2ZPHH38cgOeee47evXtTWFjISSedtNtnHjp0KI899lj161atWgHw8ccf079/f4qKiujevXt1HLEx/+pXv6J79+50796dO+64A6DGn006RW2B/BE4C8DM9gdeBs4DpprZ99MUm4ikyG233cZhhx1GeXk5EydOBGDhwoXceeedLF26FID777+fBQsWUFZWxuTJk1m7du1u+1m2bBljx45lyZIltG3btvoLc+TIkdx1110sWLCASZMmVZ9iuvrqqxkzZgyLFy/mwAMPTBhbSUlJ9RdlWVkZlZWVbN++nTlz5tC/f/9aP8cbb7zBHXfcwZtvvsl7773HvHnz+OKLLxg6dCiPPPIIixcvZseOHdxzzz1J66dz586MHj2aa665hvLyckpKSnZZf+ONN9KrVy8WLVrELbfcwqWXXgrAz372M/bdd18WL17MokWLOPHEE1m9ejUjRozg8ccfp6KigkcffbTmH06MmTNnctppp1FeXk5FRQVFRUW7rF+wYAHTp0/ntddeY/78+dx333288cYbQPKfTTpFTSA9gfnh8/OBd929G3ApMCodgeWtESOCRSTDjj322F36A0yePJnCwkL69evHhx9+yLJly3Z7T5cuXaq/1Pr06cOKFSuorKzklVde4YILLqCoqIhRo0bx8ccfAzBv3jwuuig4UXHJJZckjKNPnz4sWLCADRs2sPfee3PcccdRVlbGnDlzdvsiT/Y5OnXqxB577EFRURErVqzgnXfeoUuXLnTt2hWAyy67jJdffrluFRRj7ty51fGfeOKJrF27lg0bNvDCCy8wduzY6u3atWvH/Pnz6d+/f3Xd7rfffpGPc8wxxzB9+nTGjx/P4sWLad269W5xnHfeebRs2ZJWrVoxaNCg6uSb6GeTblETyD5A1ZWvk4FZ4fOFwP9EPZiZ7WdmT5rZJjNbaWaDk2x3jZm9Z2YbzOwjM7vdzPLjgv+0acEikmEtW7asfl5aWsoLL7zAq6++SkVFBb169UrYY37vvfeufr7nnnuyY8cOdu7cSdu2bSkvL69e3nrrrertart1tHnz5nTp0oUZM2Zw/PHHU1JSwuzZs3n33Xc56qijav0ciWKqSbNmzdi5cydAxkYFiI1h586dbNu2DYD+/fvz8ssv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\n",
      "text/plain": [
       "<Figure size 432x216 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(6, 3))\n",
    "ax = fig.add_subplot(111)\n",
    "ax.spines['top'].set_visible(False)\n",
    "ax.spines['right'].set_visible(False)\n",
    "ax.tick_params(axis='both', which='major', labelsize=12)\n",
    "ax.tick_params(axis='both', which='minor', labelsize=12)\n",
    "plt.hist(position_errors_wo_occlusion, bins=np.arange(40 + 1),\n",
    "         density=True, rwidth=0.8, alpha=0.5, label='trained without occlusion', color='dimgray')\n",
    "plt.hist(position_errors_with_occlusion, bins=np.arange(40 + 1),\n",
    "         density=True, rwidth=0.8, alpha=0.5, label='trained with occlusion', color='darkmagenta')\n",
    "plt.axvline(x=5, ls='--', lw=2, c='r')\n",
    "plt.xlabel('position error (cm)', fontsize=14)\n",
    "plt.ylabel('fraction of instances', fontsize=14)\n",
    "plt.xlim(0, 40)\n",
    "plt.legend()\n",
    "plt.savefig('figures/errors_position_with_occlusion.pdf', bbox_inches='tight')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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eOyECRMoLy9n4MCBvPXWW7z66qtbvKZnz561H4L9+/dn6dKlrFmzhmeeeYbTTjuNiooKzj//fN59910AZs2axRlnhI6Ss87KtFJJ2E91dTWrVq1ihx124NBDD2XOnDnMmDFjiw/+bO+je/futGrVioqKCpYuXcorr7xCz5492W+//QA455xzmD59euNOUIqZM2fWxn/EEUewYsUKVq1axRNPPMHFF19cW65Tp07Mnj2bwYMH157bzp07Jz7OQQcdxNSpUxk7diwLFy6kQ4e6cx/PnDmTk08+mfbt21NSUsKwYcNqK+tMv5tCS3oNZ0fChJoARxHWsQGYC3wu10E1CyNHFjsC57ZJ+/btax9XVVXxxBNP8Oyzz7LTTjsxZMiQjMNnd9hhh9rHrVu3Zv369WzevJlddtmFefPmZTxOQyOj2rZtS8+ePbn99ts57LDDKCsr46mnnuK1116jV69eDb6P9Jg2bdpUb/k2bdqwefNmgKLdiJsaw+bNm9mwYQMAgwcPZvr06TzyyCOMGDGCyy67rLY11ZBMv5tCS9rCeRUYJulzwDHAX2J6N6DpD40ohilTwubcdqBDhw6sXp1p4vZg5cqVdOrUiZ122omXX36Z2bNnZy2brmPHjvTs2bO268jMmD8/LHc1aNAgfv/73wNw5513Zt1HZWUl48ePZ/DgwVRWVjJp0iT69u27RWXV0Puosf/++7N06VJee+01AH77299y+OGHA6H7rLq6GqBOt1N9+66srKyNv6qqil133ZWOHTty9NFHM3HixNpyH374IQMHDmT69Om88cYbQLj+ky41hocffpiNGzcC8Oabb9KtWzdGjhzJeeedx9y02y8qKyt58MEHWbduHWvXrmXatGmJWoGFkrTCuQYYBywFZpvZczH9WMJkms657ViXLl0YNGgQffr0qb3Ynuq4445j06ZN9OrVizFjxjBw4MBG7f/OO+/k1ltvpby8nN69e/PQQw8BcNNNNzFx4kRKS0t5++23s76+srKSd999l0MPPZRu3brRrl27jB+kDb2PGu3atWPq1KmcdtpplJaW0qpVKy644AIgXI8ZPXo0AwYMoHXr1rWv+cpXvsK0adMyDhoYO3Ys1dXVlJWVMWbMGO644w4Arr76aj788EP69OlDeXk5Tz31FF27dmXKlCkMGzaM8vJyTj/99C3iGzlyJE8//TTl5eU8++yzta3NqqoqysvL6du3L/fccw+jR4+u87p+/foxYsQIDj74YA455BDOO+88+vbtm/U8FJos4QSTkroBewDzzWxzTDsEWGlmL+cvxNwZMGCAXbzfxVnzz73r3NwdLH478dkGXBIvvfRSou4h5/Ity99iTu4ITXwfTlza+V+SuklaHteiea7BF7ZUAwaEnz5jtHPOAcnvw2kr6WeSVgNvAz1i+jhJub/DyjnnXLOT9BrODwn34XwD+CQl/XlgRI5jcs451wwl7VI7A/immT0taXNK+j+A/XIflnPOueYmaQtnD+DNDOlt8PnYnHPOJZC0wlkEDM6Q/jWgOnfhOOeca64acx/OzZK+B7QGTpM0FRgD/ChfwTnnCsOXJ9h26RNuJvXOO+9w6qmn5iGipidRd5iZ/VHS14DvApsJgwjmAl8xsyfyGN/2a86cYkfgtmOzxs7K6f4GjR1Ub74vT1A8e+yxx1ZVVNujxAuwmdnjZna4mZWY2U5m9kUz+0vDr2yhfIlptx1picsTpJo3bx4DBw6krKyMk08+mQ8//BCA1157jaOOOory8nL69evHkiVLABg3bhylpaWUl5czZsyYLfaXaYkDgKeffpqKigoqKiro27cvq1evZunSpfTp0wcIc7fVLGfQt29fnnrqKSAszjZs2DCOO+449t13X6688sqGf6lNUNL7cA6XdHiW9EzXdpxz25GWtjxBurPPPptx48axYMECSktLueaaawAYPnw4F198MfPnz+eZZ55h991357HHHuOhhx7iueeeY/78+Y368B8/fjwTJ05k3rx5zJgxgx133LFO/sSJE5HEwoULufvuuznnnHNqJxCdN29e7XIK99xzD2+99Vbi4zYVSUeY/QK4NkN6R2As0Ky+ytfXndFQ10StUaPCT5/A022nMi1PMG3aNIDa5Qm6dOlS5zUNLU9Qo2axs1mzZtVWSmeddRZXXXXVFnGkL0/Qr1+/2uUJalo+Db2P7t27A9QuT/DFL36xNn/lypV89NFHtZN3nnPOOZx22mmsXr2at99+m5NPPhkI868BPPHEE5x77rnstNNOQOOWFxg0aBCXXXYZw4cPZ9iwYbVx1Zg5cybf+ta3ADjggAPYa6+9aiv8I488kp133hmAAw88kDfffJPPfW77mqw/aYWzPzA/Q/o/Yp5Ld8st4adXOG471VKXJ8iF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\n",
      "text/plain": [
       "<Figure size 432x216 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(6, 3))\n",
    "ax = fig.add_subplot(111)\n",
    "ax.spines['top'].set_visible(False)\n",
    "ax.spines['right'].set_visible(False)\n",
    "ax.tick_params(axis='both', which='major', labelsize=12)\n",
    "ax.tick_params(axis='both', which='minor', labelsize=12)\n",
    "plt.hist(orientation_errors_wo_occlusion, bins=np.arange(0, 180 + 1, 5),\n",
    "         density=True, rwidth=0.8, alpha=0.5, label='trained without occlusion', color='dimgray')\n",
    "plt.hist(orientation_errors_with_occlusion, bins=np.arange(0, 180 + 1, 5),\n",
    "         density=True, rwidth=0.8, alpha=0.5, label='trained with occlusion', color='darkmagenta')\n",
    "plt.axvline(x=15, ls='--', lw=2, c='r')\n",
    "plt.xlabel('orientation error (degrees)', fontsize=14)\n",
    "plt.ylabel('fraction of instances', fontsize=14)\n",
    "plt.xlim(0, 180)\n",
    "plt.ylim(0, 0.08)\n",
    "plt.legend()\n",
    "plt.savefig('figures/errors_orientation_with_occlusion.pdf', bbox_inches='tight')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
